
/*
 * Copyright 2002-2018 the original author or authors.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/*
 *版权所有2002-2018原作者。
 *
 *根据Apache许可证2.0版（“许可证”）获得许可；
 *除非符合许可证，否则不得使用此文件。
 *您可以在以下地址获取许可证副本：
 *
 *      https://www.apache.org/licenses/LICENSE-2.0
 *
 *除非适用法律要求或书面同意，软件
 *根据许可证分发的内容是按“原样”分发的，
 *无任何明示或暗示的保证或条件。
 *有关管理权限和
 *许可证下的限制。
 */

package org.springframework.aop.framework.adapter;

import org.aopalliance.intercept.MethodInterceptor;

import org.springframework.aop.Advisor;

/**
 * Interface for registries of Advisor adapters.
 *
 * <p><i>This is an SPI interface, not to be implemented by any Spring user.</i>
 *
 * @author Rod Johnson
 * @author Rob Harrop
 */
/**
 *Advisor适配器注册表的接口。
 *
 *＜p＞＜i＞这是一个SPI接口，任何Spring用户都不能实现</我>
 *
 *@作者Rod Johnson
 *@作者Rob Harrop
 */
public interface AdvisorAdapterRegistry {

	/**
	 * Return an {@link Advisor} wrapping the given advice.
	 * <p>Should by default at least support
	 * {@link org.aopalliance.intercept.MethodInterceptor},
	 * {@link org.springframework.aop.MethodBeforeAdvice},
	 * {@link org.springframework.aop.AfterReturningAdvice},
	 * {@link org.springframework.aop.ThrowsAdvice}.
	 * @param advice an object that should be an advice
	 * @return an Advisor wrapping the given advice (never {@code null};
	 * if the advice parameter is an Advisor, it is to be returned as-is)
	 * @throws UnknownAdviceTypeException if no registered advisor adapter
	 * can wrap the supposed advice
	 */
	/**
	 *返回包装给定建议的｛@link Advisor｝。
	 *＜p＞默认情况下应至少支持
	 *｛@link org.aopalliance.incept.MethodInterceptor｝，
	 *{@link.org.springframework.aop.MethodBeforeAdvice}，
	 *{@link.org.springframework.aop.AfterReturningAdvice}，
	 *｛@link.org.springframework.aop.ThrowsAdvice｝。
	 *@param advice应该是建议的对象
	 *@return包装给定建议的Advisor（从不｛@code null｝；
	 *如果建议参数是Advisor，则按原样返回）
	 *如果没有注册的顾问适配器，@throws UnknownAviceTypeException
	 *可以包装假设的建议
	 */
	Advisor wrap(Object advice) throws UnknownAdviceTypeException;

	/**
	 * Return an array of AOP Alliance MethodInterceptors to allow use of the
	 * given Advisor in an interception-based framework.
	 * <p>Don't worry about the pointcut associated with the {@link Advisor}, if it is
	 * a {@link org.springframework.aop.PointcutAdvisor}: just return an interceptor.
	 * @param advisor the Advisor to find an interceptor for
	 * @return an array of MethodInterceptors to expose this Advisor's behavior
	 * @throws UnknownAdviceTypeException if the Advisor type is
	 * not understood by any registered AdvisorAdapter
	 */
	/**
	 *返回AOP Alliance MethodInterceptor数组，以允许使用
	 *在基于拦截的框架中给定Advisor。
	 *＜p＞如果与｛@link Advisor｝相关联的切入点是
	 *a｛@linkorg.springframework.aop.PointcutAdvisor｝：只需返回拦截器。
	 *@param advisor顾问为其查找拦截器
	 *@返回一个MethodInterceptor数组以暴露此Advisor的行为
	 *如果Advisor类型为
	 *任何注册的AdvisorAdapter都无法理解
	 */
	MethodInterceptor[] getInterceptors(Advisor advisor) throws UnknownAdviceTypeException;

	/**
	 * Register the given {@link AdvisorAdapter}. Note that it is not necessary to register
	 * adapters for an AOP Alliance Interceptors or Spring Advices: these must be
	 * automatically recognized by an {@code AdvisorAdapterRegistry} implementation.
	 * @param adapter an AdvisorAdapter that understands particular Advisor or Advice types
	 */
	/**
	 *注册给定的｛@link AdvisorAdapter｝。请注意，无需注册
	 *AOP联盟拦截器或Spring建议的适配器：这些适配器必须
	 *｛@code AdvisorAdapterRegistry｝实现自动识别。
	 *@param adapter一个了解特定Advisor或Advice类型的AdvisorAdapter
	 */
	void registerAdvisorAdapter(AdvisorAdapter adapter);

}
